package javacroft.view.GUI;

import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;
import java.awt.Toolkit;

// ============================================================================================
public class NumericDocument extends PlainDocument
// ============================================================================================
{
    int             tailleMaxPartieEntière;
    int             tailleMaxPartieDécimale;
    // ================================================================================================================
    /**
     * Création d'un PlainDocument qui n'accepte que les les chiffres et le point décimal
     * @param taillePartieEntière taille de la partie entière
     * @param taillePartieDécimale taille de la partie décimale
     */
    public NumericDocument( int taillePartieEntière, int taillePartieDécimale )
    // ================================================================================================================
    {
        if( taillePartieEntière < 0 || taillePartieDécimale < 0 )
        {
            throw new IllegalArgumentException( "ERREUR de création du NumericDocument :  taillePartieEntière et taillePartieDécimale doivent être >= 0" );
        }
        tailleMaxPartieEntière = taillePartieEntière;
        tailleMaxPartieDécimale = taillePartieDécimale;
    }

    // --------------------------------------------------------------------------------------------------------------------------
    @Override
    public void insertString( int offset, String string, AttributeSet attrib ) throws BadLocationException
    // --------------------------------------------------------------------------------------------------------------------------
    {
        
        StringBuffer stringBuffer = new StringBuffer( getText( 0, getLength() ) );
        stringBuffer.insert( offset, string );
        try
        {
            if( stringBuffer.length() > 0 )
            {
                // conversion en nombre
                new Double( stringBuffer.toString() );
            }
        }
        catch( NumberFormatException e )
        {
            // le résultat de la conversion en nombre à échoué
            Toolkit.getDefaultToolkit().beep();
            return;
        }

        int         indexPointDécimal           = stringBuffer.toString().indexOf( '.' );
        int         taillePartieEntière;
        int         taillePartieDécimale;

        if( tailleMaxPartieDécimale == 0 && indexPointDécimal != -1 )
        {
            //pas de partie décimale autorisée mais point décimal trouvé
            Toolkit.getDefaultToolkit().beep();
            return;
        }
        
        // set de la partie entière et décimale du nouveau nombre
        if( indexPointDécimal == -1 )
        {
            // pas de point décimal, donc taillePartieDécimale = 0 and taillePartieEntière = la longeur du nouveau nombre
            taillePartieEntière = stringBuffer.length();
            taillePartieDécimale = 0;
        }
        else
        {
            // la partie entière = le nombre formé par la chaine jusqu'à la position du point décimal
            taillePartieEntière = indexPointDécimal;

            // la partie décimale = le nombre formé par la chaine entre le point décimal et la fin de la chaine
            taillePartieDécimale = stringBuffer.length() - indexPointDécimal - 1;
        }
        // on vérifie que le nombre formé n'est pas plus grand que le maximum autorisé
        if( taillePartieEntière <= tailleMaxPartieEntière && taillePartieDécimale <= tailleMaxPartieDécimale )
        {
            // tout va bien donc on autorise les changement au JTextField
            super.insertString( offset, string, attrib );
        }
        else
        {
            // la partie entière ou décimale sont plus grand que le maximum autorisé
            Toolkit.getDefaultToolkit().beep();
        }
    }
}